home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / lib / util / expand.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-02-01  |  1.2 KB  |  75 lines

  1. /*
  2.  *            E X P A N D . C
  3.  *
  4.  *    Expand expands a text string expanding macros provided
  5.  *  in a vector of key and value pairs.
  6.  *
  7.  *  e.g.    expandl(buf, "$A+$B=$(RESULT)", array)
  8.  *  with    char *array[] = {"A", "1",
  9.  *                 "B", "2",
  10.  *                 "RESULT", "3",
  11.  *                 0, 0};
  12.  *  gives    "1+2=3" in buf.
  13.  *
  14.  *  wja@uk.ac.nott.maths        Wed Feb 22 15:00:26 GMT 1984
  15.  *  DPK@BRL, 13 Apr 84    Made more portable and changed array usage.
  16.  */
  17.  
  18. #include "util.h"
  19.  
  20. LOCFUN  char *exname(), *exlookup();
  21.  
  22. char *
  23. expand(buf, fmt, argp)
  24. char *buf, *fmt, **argp;
  25. {
  26.     register char *bp = buf, *cp;
  27.     char name[64];
  28.  
  29.     while(*fmt) {
  30.         if(*fmt != '$')
  31.             *bp++ = *fmt++;
  32.         else if(*++fmt == '$')
  33.             *bp++ = *fmt++;
  34.         else {
  35.             fmt = exname(name, fmt);
  36.             cp = exlookup(name, argp);
  37.             while(*cp)
  38.                 *bp++ = *cp++;
  39.         }
  40.     }
  41.     *bp = '\0';
  42.     return buf;
  43. }
  44.  
  45. LOCFUN char *
  46. exname(buf, str)
  47. register char *buf, *str;
  48. {
  49.     if(*str == '(') {
  50.         str++;
  51.         while(*str != ')' && *str != '\0')
  52.             *buf++ = *str++;
  53.         if(*str != '\0')
  54.             str++;
  55.     }
  56.     else
  57.         *buf++ = *str++;
  58.     *buf = '\0';
  59.     return str;
  60. }
  61.  
  62. LOCFUN
  63. char *
  64. exlookup(name, list)
  65. register char *name, **list;
  66. {
  67.     while(*list)
  68.     {
  69.         if(lexequ(name, *(list++)))
  70.             return (*list);
  71.         list++;
  72.     }
  73.     return ("");
  74. }
  75.